洛谷 P1029 最大公约数和最小公倍数问题

洛谷 P1029 最大公约数和最小公倍数问题

链接

https://www.luogu.org/problem/P1029


题目

题目描述

输入2个正整数x0,y0(2≤x0<100000,2≤y*0<=1000000),求出满足下列条件的P,Q的个数

条件:

  1. P,Q是正整数
  2. 要求P,Q*以x0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的2个正整数的个数.

输入格式

2个正整数x0,y*0

输出格式

1个数,表示求出满足条件的P,Q的个数

输入输出样例

输入 #1

1
3 60

输出 #1

1
4

说明/提示

P,Q有4种

1、3,60
2、15,12
3、12,15
4、60,3

思路

题目就是输入x,y,一为最小公约数,一为最大公倍数,求存在的pq对数。

p=x*k1,q=x*k2,y=x*k1*k2,k1k2互质,这就是总结之后的关系,x*y=p*q,将基于这个公式和辗转相除法来计算。

输入xy,寻找pq乘积为xy的对,之后判断这对pq的最大公约数是不是x,是的话结果就加二(一正一反)。最后,考虑到x=y,比如3,3,若如此,结果加一。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>

using namespace std;

int gcd(int a,int b)
{
if(b!=0)
return gcd(b,a%b);
return a;
}


int main()
{
int x,y;
cin>>x>>y;
int sum=0;
for(int i=1;i*i<x*y;i++)
{
if((x*y)%i==0 && gcd(i,(x*y)/i)==x)
sum++;
}
sum = sum*2;
if(x==y)
sum++;
cout<<sum;
return 0;
}
---本文结束,感谢阅读---